[Coding025] Sort - 拓扑排序

拓扑排序

Ben 2024/01/10

More coding records

Get the knowledge flowing and circulating! :)

目录

标题:拓扑排序

【实例】 在某校的选课系统中,存在这样的规则:每门课可能有若干门先修课,如果要修读某一门课,则必须要先修读此课程所要求的先修课后才能修读。假设一个学生同时只能修读一门课程,那么,被选课系统允许的他修完他需要所有课程的顺序是一个拓扑序。
在这个例子中,每一门课程对应有向图中的一个顶点,每一个先修关系对应一条有向边(从先修课指向需要先修课的课)。

在数学里,拓扑学(英语:Topology)是一门研究拓扑空间的学科,主要研究空间内,在连续变化下维持不变的性质。在拓扑学里,重要的拓扑性质包括连通性紧致性

image-20240111111446853

在计算机科学领域,有向图的拓扑排序(英语:Topological sorting)或拓扑测序(英语:Topological ordering)是对其顶点的一种线性排序,使得对于从顶点 u 到顶点 v 的每个有向边 uvu 在排序中都在 v 之前。

例如,图形的顶点可以表示要执行的任务,并且边可以表示一个任务必须在另一个任务之前执行的约束;在这个应用中,拓扑排序只是一个有效的任务顺序。

注意:当且仅当图中没有定向环时(即有向无环图),才有可能进行拓扑排序

任何有向无环图至少有一个拓扑排序。已知有算法可以在线性时间内,构建任何有向无环图的拓扑排序。

在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,才能称为该图的一个拓扑排序

  1. 序列中包含每个顶点,且每个顶点只出现一次;

  2. 若A在序列中排在B的前面,则在图中不存在从B到A的路径。

——维基百科

补充笔记

Topological Sorting is mainly used for scheduling jobs from the given dependencies among jobs[1].

在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列[2]。且该序列必须满足下面两个条件:

  1. 每个顶点出现且只出现一次。

  2. 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

拓扑排序实例

有向无环图(DAG1有向无环图(DAG2
ImageImage
“5 4 2 3 1 0”
“4 5 2 3 1 0”
所以,一个有向无环图的拓扑排序并不唯一
“ 1 2 4 3 5 ”

拓扑排序 V.S 深度优先搜索

拓扑排序不同于DFS,(Topological Sorting vs Depth First Traversal (DFS))

For example

TopologicalDFS
ImageImage

 

Java语言代码实现

运行结果

测试样例:

image-20240110110644406

image-20240110110313671

程序评价

需要改进!!

更进一步:如何通过拓扑排序判断一个有向图中是否有环呢?